FIG. 1 is a diagram showing an example of data encoded using concatenated codes in a storage system. In the example shown, a set of first codewords 100 is associated with a first error correction code (C1). Data portion 102 and parity portion 104 form a set of third codewords which is associated with a third error correction code (C3). To save space on the storage system, codewords 100 and parity portion 104 are stored, but data 102 (shaded) is not stored.
If the error correction capability of the first code (C1) fails, parity 104 is read from storage and is used in correcting those codewords from 100 that were not able to be corrected using the first code (C1). Some other decoding techniques do this by estimating or synthesizing data portion 102. However, estimating or synthesizing data portion 102 has some drawbacks. For one, estimated values for data portion 102 are typically not fed into certain read processor components, such as Viterbi decoders, because the estimates may be bad estimates which cause a Viterbi decoder to make decisions it should not. More generally, estimates may cause new errors to be introduced into the system and thus should not be fed to Viterbi decoders and other components. Another drawback is that these estimation techniques may be computationally intensive, requiring many processing cycles. New techniques for decoding concatenated codes which overcome at least some of these drawbacks would be desirable.